option(BUILD_DOC "Build documentation" ON)

# Readme file and man page
find_program(XSLTPROC_EXECUTABLE xsltproc QUIET)
find_program(LYNX_EXECUTABLE lynx QUIET)
find_program(DOCBOOK2X_EXECUTABLE docbook2x-man QUIET)

if(BUILD_DOC AND (NOT XSLTPROC_EXECUTABLE OR NOT LYNX_EXECUTABLE))
  message(WARNING "xsltproc or lynx not found but required for doc generation.")
  set(BUILD_DOC OFF)
endif()

if(BUILD_DOC AND (NOT DOCBOOK2X_EXECUTABLE))
  message(WARNING "docbook2x-man not found but required for man generation.")
  set(BUILD_DOC OFF)
endif()

option(DOCS_XSL_VAIDATION "Docbook document validation" OFF)
option(DOCS_NOCATALOG
       "ON: Use standard catalog from OS | OFF: Use custom catalog " OFF)

set(DOCS_SOURCES
    "index.html"
    CACHE STRING "Documentation files list")

set(DOCS_README
    ${DOCS_SOURCES}
    CACHE STRING "Readme Documentation files list")

set(DOCS_HTML
    ${DOCS_SOURCES}
    CACHE STRING "HTML Documentation files list")

set(DOCS_TXT
    ${DOCS_SOURCES}
    CACHE STRING "TXT Documentation files list")

set(DOCS_OUTPUT_DIR
    ${CMAKE_BINARY_DIR}/doc/docbook
    CACHE STRING "Path to build HTML docs")

set(DOCBOOK_DIR ${CMAKE_SOURCE_DIR}/doc/docbook)
set(STYLESHEET_DIR ${CMAKE_SOURCE_DIR}/doc/stylesheets)
set(DEPS_XSL ${DOCBOOK_DIR}/dep.xsl)
set(SINGLE_HTML_XSL ${DOCBOOK_DIR}/html.xsl)
set(CHUNKED_HTML_XSL ${DOCBOOK_DIR}/html.chunked.xsl)
set(TXT_XSL ${DOCBOOK_DIR}/txt.xsl)
set(README_XSL ${DOCBOOK_DIR}/readme.xsl)

set(DOCS_HTML_CSS
    "/css/sr-doc.css"
    CACHE STRING "Path to the CSS file")

set(CATALOG ${DOCBOOK_DIR}/catalog.xml)

if(DOCS_NOCATALOG)
  set(XMLCATATLOGX "")
else()
  set(XMLCATATLOGX "XML_CATALOG_FILES=${CATALOG}")
endif()

# Set flags for xtproc for generating documentation and allow user defined
set(DOCS_XSLTPROC_FLAGS
    ""
    CACHE STRING "Xsltransform processor flags")
if(NOT DOCS_XSL_VAIDATION)
  if(VERBOSE)
    message(STATUS "DOCS_XSL_VAIDATION=OFF"
                   "Disabling xsl validation when generating documentation")
  endif()
  list(APPEND DOCS_XSLTPROC_FLAGS --novalid)
endif()

# Set lynx flags for generating readmes and allow user defined
set(DOCS_LYNX_FLAGS
    "-nolist"
    CACHE STRING "Lynx readme generator flags")

# Function to add a module docs entry
function(docs_add_module module_name)
  # message(STATUS "Adding documentation for module ${MODULE_NAME}")
  set(module_path "${MODULES_DIR}/${module_name}")
  set(module_doc_path "${module_path}/doc")

  add_custom_target(
    ${module_name}_doc_text
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${module_name}/${module_name}.txt
    COMMENT "Processing target ${module_name}_doc_text")

  # This is essentialy an alias of doc_text target but with extra copy command
  # to copy the text file to the source tree directory.
  add_custom_target(${module_name}_readme
                    COMMENT "Processing target ${module_name}_readme")
  add_dependencies(${module_name}_readme ${module_name}_doc_text)
  add_dependencies(kamailio_docs_readme ${module_name}_readme)

  add_custom_target(
    ${module_name}_doc_html
    DEPENDS ${DOCS_OUTPUT_DIR}/${module_name}.html
    COMMENT "Processing target ${module_name}_doc_html")

  add_custom_target(${module_name}_doc
                    COMMENT "Processing target ${module_name}_doc")
  add_dependencies(${module_name}_doc ${module_name}_doc_text
                   ${module_name}_doc_html)

  # Man docs only if author of module provided xml for man.
  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/${module_name}.xml)
    add_custom_target(
      ${module_name}_man
      DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/${module_name}.xml
      COMMENT "Processing target ${module_name}_man")
    add_dependencies(kamailio_docs_man ${module_name}_man)
  endif()

  # Each version has seperate custon commands for not recompiling all if 1 gets
  # changed.
  if(XSLTPROC_EXECUTABLE)
    if(LYNX_EXECUTABLE)
      add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${module_name}/${module_name}.txt
        COMMAND
          # TXT version - just plain text
          ${XMLCATATLOGX} ${XSLTPROC_EXECUTABLE} ${DOCS_XSLTPROC_FLAGS}
          --xinclude ${TXT_XSL} ${module_name}.xml | ${LYNX_EXECUTABLE}
          ${DOCS_LYNX_FLAGS} -stdin -dump >
          ${CMAKE_CURRENT_BINARY_DIR}/${module_name}/${module_name}.txt
        DEPENDS
          ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/doc/${module_name}.xml
          ${TXT_XSL}
          # ${SINGLE_HTML_XSL}
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/doc
        COMMENT "Generating text documentation with for ${module_name}")

      # Add custom command to copy the README file after the readme target is
      # built. The readme target depends on doc_text so it will regenerate if
      # it's input changed.
      add_custom_command(
        TARGET ${module_name}_readme
        POST_BUILD
        COMMAND
          ${CMAKE_COMMAND} -E copy
          ${CMAKE_CURRENT_BINARY_DIR}/${module_name}/${module_name}.txt
          ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/README
        COMMENT "Copying README file to source tree for ${module_name}")

      add_custom_command(
        OUTPUT ${DOCS_OUTPUT_DIR}/${module_name}.html
        COMMAND
          # HTML version
          ${XMLCATATLOGX} ${XSLTPROC_EXECUTABLE} ${DOCS_XSLTPROC_FLAGS}
          --xinclude --stringparam base.dir ${DOCS_OUTPUT_DIR} --stringparam
          root.filename ${module_name} --stringparam html.stylesheet
          ${DOCS_HTML_CSS} --stringparam html.ext ".html" ${SINGLE_HTML_XSL}
          ${module_name}.xml
        DEPENDS
          ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/doc/${module_name}.xml
          ${SINGLE_HTML_XSL}
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/doc
        COMMENT "Generating html documentation for ${module_name}")
    endif()

    add_custom_command(
      # man version
      OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${module_name}/${module_name}.7
      COMMAND ${DOCBOOK2X_EXECUTABLE} -s ${STYLESHEET_DIR}/serdoc2man.xsl
              ${module_name}.xml
      DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/doc/${module_name}.xml
              ${STYLESHEET_DIR}/serdoc2man.xsl
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}
      COMMENT "Processing target ${module_name}_man")

    install(
      FILES ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/README
      RENAME README.${module_name}
      DESTINATION ${CMAKE_INSTALL_DOCDIR}/modules
      COMPONENT kamailio_docs)

    install(
      FILES ${CMAKE_CURRENT_SOURCE_DIR}/${module_name}/${module_name}.7
      DESTINATION ${CMAKE_INSTALL_DATADIR}/man/man7
      COMPONENT kamailio_docs
      OPTIONAL)
  endif()
endfunction()
